#資料預處理
#匯入所需模組
from keras.utils import np_utils
import numpy as np
np.random.seed(10)
#讀取mnist資料
from keras.datasets import mnist
(x_train_image,y_train_label),
(x_test_image,y_test_label)=mnist.load_data()
#將features(數字影像特徵值),使用reshape轉換:原本28x28的數字影像,以reshape轉換為784個float數字。
x_Train = x_train_image.reshape(60000,784).astype('float32')
x_Test = x_test_image.reshape(10000,784).astype('float32')
#將features(數字影像特徵值)標準化:提高模型預測的準確度,並更快收斂。
x_Train_normalize = x_Train / 255
x_Test_normalize = x_Test / 255
label(數字的真實值)以 One-hot encoding 轉換:使用np_uutils.to_categorical將label進行One-hot encoding轉換。
y_Train_OneHot = np_utils.to_categorical(y_train_label)
y_Test_OneHot = np_utils.to_categorical(y_test_label)
#建立模型
#匯入所需模組
from keras.models import Sequential
from keras.layers import Dense
#建立Sequential模型:建立一個線性堆疊模型,之後只需要用model.add()method,將各層神經網路加入。
model = Sequential()
#加入輸入層和隱藏層(隱藏層神經元數量為256,輸入神經元數量為784,使用normal distribution常態分佈的亂數初始化weight和bias,激活函數為relu)
model.add(Dense(units=256,input_dim=784,kernel_initializer='normal',activation='relu'))
#加入輸出層(輸出神經元數量為10個,使用normal distribution常態分佈的亂數初始化weight和bias,激活函數為softmax,不需要設定input_dim是因為這一層的input_dim就是上一層的units)
model.add(Dense(units=10,kernel_initializer='normal',activation='softmax'))
#輸出模型摘要
print(model.summary())
#訓練
#定義訓練方法(loss(損失函數)在深度學習通常使用categorical_crossentropy(交叉熵)訓練的效果會最好,optimizer(設定最優化方法)在深度學習中使用adam最優化方法可以讓訓練效果更快收斂,並且提高準確率,metrics設定評估模型的方法是accuracy準確率)
model.compile(loss='categorical_crossentropy',optimizer='adam',metrics=['accuracy'])
#開始訓練(features數字影像特徵值,label數字影像特徵值,設定參數,設定 epochs(訓練週期)為10次,每次200批資料,顯示訓練過程)
train_history = model.fit(x=x_Train_normalize,y = y_Train_OneHot,validation_split=0.2,epochs = 10,batch_size=200,verbose=2)
validation_split=0.2:因為總共有60000筆資料,所以會分成60000x0.8=48000為訓練資料60000x0.2=12000為驗證資料
使用48000筆資料訓練,分成200筆資料一次,所以大概會分成240批。
模型摘要:
256個神經元的隱藏層,10個神經元的輸出層。
Param的計算方法:上一層神經元數量x本層神經元數量+本層神經元數量(因為輸入層和隱藏層公式為,而輸出層公式為)
從上表可以得知:
隱藏層的Param是200960因為784x256+256=200960
輸出層的Param是2570因為256x10+10=2570
必須訓練的Trainable Params(超參數)為200960+2570=203530
通常Trainable Param 越大,模型越複雜,所需的訓練時間也越長。
訓練結果:
從上表可以看出loss誤差越來越小,準確率越來越高
全部打完之後發現之前遇到的問題也一起解決了,結論是終端機跳的error一定要看清楚。